#include <stdio.h>

/* 整数的左移和右移
 * 1.左移：高位丢弃，低位补0
 *   特殊情况：若移位位数超过类型长度，则先对类型长度取模，再移位；
 * 2.右移：分为逻辑右移和算数右移
 *   逻辑右移：低位丢弃，高位补0，无符号数的右移是逻辑右移；
 *   算数右移：低位丢弃，高位补符号位，有符号数的右移是算数右移。
 * */

int main() {
    // 有符号数右移：算术右移
    int a = 0x80000000;
    int b = 12;
    short c = 0x8000;
    short d = 12;
    unsigned e = (unsigned)a;
    printf("%x\n", a >> 2); // e0000000，高位补1
    printf("%x\n", b >> 2); // 3，高位补0
    printf("%x\n", c >> 2); // ffffe000，高位补1，得到e000，在转为int，得到ffffe000
    printf("%x\n", d >> 2); // 3，高位补0
    printf("%x\n", e >> 2); // 20000000 无符号数右移，高位补0 

    return 0;
}
